#include <iostream>
#include <future>
#include <thread>

/*  std::promise是一个类模板，它的作用是在不同的线程中实现数据的同步，
    与future结合使用，也间接实现了future在不同线程间的同步。*/

/*
    promise还有一个函数是set_value_at_thread_exit(),
    这个翻译一下就可以直到它的作用是当在这个线程执行结束的时候才会将future的状态设置为ready，
    而set_value()则直接将future的状态设置为ready。需要注意的是在使用的过程中不能多次set_value()，
    也不能多次get_future()和多次get()，因为一个promise对象只能和一个对象相关联，否则就会抛出异常。
*/

int fun(int x, std::promise<int>& p) {
	x++;
	x *= 10;
	p.set_value(x);
	std::cout << std::this_thread::get_id() << std::endl;
	return x;
}


int main()
{
	std::promise<int> p;
    // 并将结果返回给future
	std::future<int> fu = p.get_future();

	std::thread t(fun, 1, std::ref(p));
    t.join();

    // 当promise还没有值的时候在此等待
	std::cout << fu.get() << std::endl;          
	std::cout << std::this_thread::get_id() << std::endl;
	return 0;
}